package 中等.并查集;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * 问题描述
 * w星球的一个种植园，被分成 m * n 个小格子（东西方向m行，南北方向n列）。每个格子里种了一株合根植物。
 * 这种植物有个特点，它的根可能会沿着南北或东西方向伸展，从而与另一个格子的植物合成为一体。
 * 如果我们告诉你哪些小格子间出现了连根现象，你能说出这个园中一共有多少株合根植物吗？
 * <p>
 * 输入格式
 * 第一行，两个整数m，n，用空格分开，表示格子的行数、列数（1<m,n<1000）。
 * 接下来一行，一个整数k，表示下面还有k行数据(0<k<100000)
 * 接下来k行，第2+k行两个整数a，b，表示编号为a的小格子和编号为b的小格子合根了。
 * <p>
 * 格子的编号一行一行，从上到下，从左到右编号。
 * 比如：5 * 4 的小格子，编号：
 * 1 2 3 4
 * 5 6 7 8
 * 9 10 11 12
 * 13 14 15 16
 * 17 18 19 20
 */
public class 合根植物_蓝桥杯 {

    //5 4
    //16
    //2 3
    //1 5
    //5 9
    //4 8
    //7 8
    //9 10
    //10 11
    //11 12
    //10 14
    //12 16
    //14 18
    //17 18
    //15 19
    //19 20
    //9 13
    //13 17
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] s1 = br.readLine().split(" ");

        DSU dsu = new DSU(Integer.valueOf(s1[0]) * Integer.valueOf(s1[1]) + 1);
        Integer count = Integer.valueOf(br.readLine());
        while (count-- > 0) {
            String[] s2 = br.readLine().split(" ");
            dsu.union(Integer.valueOf(s2[0]), Integer.valueOf(s2[1]));
        }

        int ans = 0;
        for (int i = 1; i < dsu.pre.length; i++) {
            if (dsu.pre[i] == i) {
                ans++;
            }
        }
        System.out.println(ans);
    }

    static class DSU {

        private int[] pre;

        public DSU(int n) {
            pre = new int[n];
            for (int i = 0; i < n; i++) {
                pre[i] = i;
            }
        }

        public int find(int x) {
            if (pre[x] == x) {
                return x;
            }
            return pre[x] = find(pre[x]);
        }

        public void union(int x, int y) {
            x = find(x);
            y = find(y);

            if (x == y) return;
            pre[x] = y;
        }
    }

}
